/*******************************************************************************
 * Classe Jeu : création et gestion de l'aire de jeu
 ******************************************************************************/
package tp2;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
 *
 * @author W&G
 */
public class Jeu extends JPanel {

    private static Fenetre fenetre;//Fenetre du programme
    //panneau conteneur
    private JPanel pnlConteneur = new JPanel(new GridLayout(8, 8));
    //Etiquette des pions du joueur 1
    private static JLabel lblNbPions1 = new JLabel(2 + " pions");
    //Etiquette des pions du joueur 2
    private static JLabel lblNbPions2 = new JLabel(2 + " pions");
    private JButton btnRetour = new JButton("Retour");//Bouton retour
    //Bouton sauvegarder
    private JButton btnSauvegarder = new JButton("Sauvegarder");
    private JButton btnCharger = new JButton("Charger");//Bouton charger
    //Etiquette du tour des joueurs
    private static JLabel lblTour = new JLabel("Tour : Joueur 1");
    //Bouton du SuperRedd
    private static JButton btnSuperRedd = new JButton("Super Redd !");
    //Bouton d'abandon
    private JButton btnAbandonner = new JButton("Jeter l'éponge");
    private JPanel pnlA = new JPanel();//panneau A
    private JPanel pnlC = new JPanel();//Panneau C
    private JPanel pnlD = new JPanel();//Pannaeu D
    //Panneeau principal du haut
    private JPanel pnlDuHaut = new JPanel(new GridLayout(1, 3));
    private JPanel pnlDuBas = new JPanel();//Panneau principal du bas
    //Gestion clicks
    private BoutonPresse monBoutonPresse = new BoutonPresse();
    private static Case[][] cases = new Case[8][8];//Tableau contenant ls cases
    //Panneau popUpSauvegarder
    private static PopUpSauvegarder popUpSauvegarder = new PopUpSauvegarder();
    private static boolean sauvegarde = true;//variable de suvegarde
    private static PopUpVictoire popUpVictoire;//Panneau de PopUpVictoire
    private static boolean superRedd = false;//variable du superRedd

    public enum Joueur {//enum des joueur

        JOUEUR1, JOUEUR2
    }

    public Jeu(Fenetre f) {

        super(new BorderLayout());
        ajouterElements();

        fenetre = f;
        pnlA.setBackground(fenetre.getFond());
        pnlC.setBackground(fenetre.getFond());
        pnlD.setBackground(fenetre.getFond());
        pnlDuHaut.setBackground(fenetre.getFond());
        pnlDuBas.setBackground(fenetre.getFond());
        pnlConteneur.setBackground(fenetre.getFond());

        fenetre.getPnlConteneur().setPreferredSize(new Dimension(700, 700));
        this.setPreferredSize(new Dimension(600, 660)); // taille du plateau
        fenetre.getPnlConteneur().setPreferredSize(new Dimension(600, 600));
        this.setPreferredSize(new Dimension(512, 584)); // taille du plateau
    }

    private void ajouterElements() {//Ajoute les elements graphiques au panneau

        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if ((i + j) % 2 == 0) {
                    cases[i][j] = new Case(false, i, j);
                    pnlConteneur.add(cases[i][j]);
                } else {
                    cases[i][j] = new Case(true, i, j);
                    pnlConteneur.add(cases[i][j]);
                }
            }
        }
        mettreAZero();
        lblTour.setPreferredSize(new Dimension(130, 20));
        lblTour.setHorizontalAlignment(SwingConstants.RIGHT);
        lblTour.setVerticalAlignment(SwingConstants.BOTTOM);
        lblTour.setForeground(Case.Couleur.PION1.getCouleur());
        lblNbPions1.setForeground(Case.Couleur.PION1.getCouleur());
        lblNbPions2.setForeground(Case.Couleur.PION2.getCouleur());

        pnlA.add(lblTour);
        pnlDuHaut.add(pnlA);

        pnlDuBas.add(lblNbPions1);
        pnlDuBas.add(btnRetour);
        pnlDuBas.add(btnCharger);
        pnlDuBas.add(btnSauvegarder);
        pnlDuBas.add(lblNbPions2);

        btnSuperRedd.setEnabled(false);
        pnlC.add(btnSuperRedd);
        pnlDuHaut.add(pnlC);
        pnlD.add(btnAbandonner);
        pnlDuHaut.add(pnlD);

        this.add(pnlDuHaut, BorderLayout.NORTH);
        this.add(pnlConteneur, BorderLayout.CENTER);
        this.add(pnlDuBas, BorderLayout.SOUTH);

        btnRetour.addActionListener(monBoutonPresse);
        btnSauvegarder.addActionListener(monBoutonPresse);
        btnCharger.addActionListener(monBoutonPresse);
        btnAbandonner.addActionListener(monBoutonPresse);
        btnSuperRedd.addActionListener(monBoutonPresse);

        popUpSauvegarder.setBounds(220, 270, 200, 100);


    }
//Definit lasauvegarde
    public static void setSauvegarde(boolean s) {
        sauvegarde = s;
    }
//Les methodes qui suivent retour les variables à modifier lors du jeu
    public static boolean getSauvegarde() {
        return sauvegarde;
    }

    public static Case[][] getCases() {
        return cases;
    }

    public static JLabel getLblTour() {
        return lblTour;
    }

    public static JLabel getLblNbPions1() {
        return lblNbPions1;
    }

    public static JLabel getLblNbPions2() {
        return lblNbPions2;
    }
//Renvoie au menu principal
    public static void retourMenuPrincipal() {
        fenetre.afficherMenuPrincipal();
        popUpSauvegarder.setVisible(false);
        if(popUpVictoire != null){
        popUpVictoire.setVisible(false);
        }
    }
//Renvoie au menu de sauvegarde
    public static void retourSauvegarder() {
        fenetre.afficherSauvegarder(false, true);
        popUpSauvegarder.setVisible(false);
    }
//Declanche la victoire par gain ou abandon
    public static void victoire(Jeu.Joueur joueur) {
        popUpVictoire = new PopUpVictoire(joueur);
        popUpVictoire.setVisible(true);
        fenetre.ajouterVictoire(joueur);
    }
//Retourne le bouton superRedd
    public static JButton getBtnSuperRedd() {
        return btnSuperRedd;
    }
//Retourne la variable du SuperRedd
    public static boolean getSuperRedd() {
        return superRedd;
    }
//Définit le superRedd
    public static void setSuperRedd(boolean s) {
        superRedd = s;
    }
//remet le jeu à zero
    public static void mettreAZero() {
        for (int i = 0; i < cases.length; i++) {
            for (int j = 0; j < cases[i].length; j++) {
                if (i == 0 && j == 0 || i == 7 && j == 7) {
                    cases[i][j].chargerPions(Case.Etat.JOUEUR1);
                } else if (i == 0 && j == 7 || i == 7 && j == 0) {
                    cases[i][j].chargerPions(Case.Etat.JOUEUR2);
                } else {
                    cases[i][j].chargerPions(Case.Etat.VIDE);
                }
            }
        }
        Case.setJoueurCourant(Joueur.JOUEUR1);
        Case.chargerLabels();
        Case.setSuperReddDejaJoue1(false);
        Case.setSuperReddDejaJoue2(false);
    }
//classe de gestion des evenements
    class BoutonPresse implements ActionListener {

        public void actionPerformed(ActionEvent ae) {
            if (ae.getSource() == btnRetour) {
                if (sauvegarde) {
                    fenetre.afficherMenuPrincipal();
                    mettreAZero();
                } else {
                    if (!popUpSauvegarder.isVisible()) {
                        popUpSauvegarder.setVisible(true);
                        popUpSauvegarder.requestFocus();
                    } else {
                        popUpSauvegarder.setVisible(false);
                    }
                }
            } else if (ae.getSource() == btnSauvegarder) {
                fenetre.afficherSauvegarder(true, false);
            } else if (ae.getSource() == btnCharger) {
                fenetre.afficherCharger(true);
            } else if (ae.getSource() == btnAbandonner) {
                if (lblTour.getText().equals("Tour : Joueur 1")) {
                    victoire(Jeu.Joueur.JOUEUR2);
                } else {
                    victoire(Jeu.Joueur.JOUEUR1);
                }
            } else if (ae.getSource() == btnSuperRedd) {
                if (superRedd) {
                    superRedd = false;
                } else {
                    superRedd = true;
                }
            }
        }
    }
}
